#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
from datetime import timedelta
from dotenv import load_dotenv
from common.settings.env_utils import getenv_str, getenv_int, getenv_bool

# 加载指定的 .env 文件（在 create_app 之前调用一次即可）
load_dotenv(dotenv_path=getenv_str("DOTENV_PATH", ".env.dev"))

class Config(object):
    """项目通用配置类"""
    # Flask 运行环境
    FLASK_ENV = getenv_str('FLASK_ENV', 'development').lower()

    # Flask 应用的密钥，用于 session、CSRF 等保护
    SECRET_KEY = getenv_str('SECRET_KEY', 'default-secret-key')
    # JWT 用于加密签名的密钥（必须）
    JWT_SECRET_KEY = getenv_str('JWT_SECRET_KEY', 'default-jwt-key')

    # Flask 开发模式
    DEBUG = getenv_bool('DEBUG', False)
    LOG_LEVEL = getenv_str('LOG_LEVEL', 'INFO')

    # SQLite 配置（如不使用远程数据库则用这个）
    SQLITE_PATH = os.path.join(os.path.dirname(__file__), 'instance').replace("\\", "/")  # sqlite文件目录
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    # Redis 配置
    REDIS_HOST = getenv_str('REDIS_HOST')
    REDIS_PORT = getenv_int('REDIS_PORT')
    REDIS_DB = getenv_int('REDIS_DB')
    REDIS_PASSWORD = getenv_str('REDIS_PASSWORD')

    # JWT Token 设置部分
    JWT_ACCESS_TOKEN_EXPIRES = timedelta(seconds=getenv_int('JWT_ACCESS_TOKEN_EXPIRES', 28800))
    JWT_REFRESH_TOKEN_EXPIRES = timedelta(seconds=getenv_int('JWT_REFRESH_TOKEN_EXPIRES', 86400))
    # token 读取方式，常见方式：
    # - headers：默认，前端在 Authorization 里带 token
    JWT_TOKEN_LOCATION = ['headers']
    # token 从 header 中读取的字段名（Authorization）
    JWT_HEADER_NAME = 'Authorization'
    # token 类型前缀（Authorization: Bearer xxx）
    JWT_HEADER_TYPE = 'Bearer'
    # JWT 编码算法，默认 HS256（对称加密）
    # 如果用公钥/私钥模式可以切换为 RS256
    JWT_ALGORITHM = 'HS256'
    # 是否启用 token 黑名单机制（必须配合数据库表 TokenBlocklist）
    JWT_BLACKLIST_ENABLED = True
    # 哪些类型的 token 需要检查黑名单（access / refresh / 都要）
    JWT_BLACKLIST_TOKEN_CHECKS = ['access', 'refresh']
    # 错误消息 key（返回结构里的字段名）
    JWT_ERROR_MESSAGE_KEY = 'msg'

    # 邮件配置
    MAIL_SERVER = getenv_str('MAIL_SERVER')
    MAIL_PORT = getenv_int('MAIL_PORT')       # TLS 用 587，SSL 用 465
    MAIL_USE_TLS = getenv_bool('MAIL_USE_TLS')  # TLS 开启
    MAIL_USE_SSL = getenv_bool('MAIL_USE_SSL')   # SSL 用 True，TLS 就得是 False
    MAIL_USERNAME = getenv_str('MAIL_USERNAME')
    MAIL_PASSWORD = getenv_str('MAIL_PASSWORD')
    MAIL_DEFAULT_SENDER = ("账簿", MAIL_USERNAME)


class DevConfig(Config):
    """开发环境配置"""
    DEBUG = True
    LOG_LEVEL = 'DEBUG'
    MAIL_DEBUG = True
    # 如果.env配置了DATABASE_URL则使用，否则使用默认的SQLITE
    SQLALCHEMY_DATABASE_URI = getenv_str('DATABASE_URL', f'sqlite:///{Config.SQLITE_PATH}/dev_db.db')


class ProdConfig(Config):
    """生产环境配置"""
    DEBUG = False
    LOG_LEVEL = 'INFO'
    SQLALCHEMY_DATABASE_URI = getenv_str('DATABASE_URL')


def get_config():
    """根据 FLASK_ENV 环境变量返回对应配置类"""
    env = getenv_str('FLASK_ENV', 'development').lower()
    if env == 'production':
        return ProdConfig
    return DevConfig

